package com.smart.community.property.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 支付方式枚举
 * 
 * @author Wu.Liang
 * @since 2025-08-25
 * @version 1.0.0
 */
@Getter
@AllArgsConstructor
public enum PaymentMethodEnum {
    
    /**
     * 现金支付
     */
    CASH(1, "cash", "现金"),
    
    /**
     * 微信支付
     */
    WECHAT(2, "wechat", "微信支付"),
    
    /**
     * 支付宝
     */
    ALIPAY(3, "alipay", "支付宝"),
    
    /**
     * 银行卡
     */
    BANK_CARD(4, "bank", "银行卡"),
    
    /**
     * 余额支付
     */
    BALANCE(5, "balance", "余额支付"),
    
    /**
     * 在线支付（通用）
     */
    ONLINE(6, "online", "在线支付");
    
    @JsonValue
    private final Integer code;
    private final String value;
    private final String description;
    
    /**
     * 根据字符串值获取枚举
     * 
     * @param value 字符串值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static PaymentMethodEnum fromValue(String value) {
        if (value == null) {
            return null;
        }
        
        for (PaymentMethodEnum method : values()) {
            if (method.getValue().equals(value)) {
                return method;
            }
        }
        return null;
    }
    
    /**
     * 根据整数值获取枚举
     * 
     * @param code 整数值
     * @return 对应的枚举，如果不存在则返回null
     */
    public static PaymentMethodEnum fromCode(Integer code) {
        if (code == null) {
            return null;
        }
        
        for (PaymentMethodEnum method : values()) {
            if (method.getCode().equals(code)) {
                return method;
            }
        }
        return null;
    }
    
    /**
     * 检查字符串值是否有效
     * 
     * @param value 字符串值
     * @return 是否有效
     */
    public static boolean isValidValue(String value) {
        return fromValue(value) != null;
    }
    
    /**
     * 检查整数值是否有效
     * 
     * @param code 整数值
     * @return 是否有效
     */
    public static boolean isValidCode(Integer code) {
        return fromCode(code) != null;
    }
}
